diff options
Diffstat (limited to 'app/api/projects/[projectId]/route.ts')
| -rw-r--r-- | app/api/projects/[projectId]/route.ts | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/app/api/projects/[projectId]/route.ts b/app/api/projects/[projectId]/route.ts new file mode 100644 index 00000000..38c11930 --- /dev/null +++ b/app/api/projects/[projectId]/route.ts @@ -0,0 +1,134 @@ +// app/api/projects/[projectId]/route.ts +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth/next'; +import { authOptions } from '@/app/api/auth/[...nextauth]/route' +import { ProjectService } from '@/lib/services/projectService'; +import { z } from 'zod'; + +// GET: 프로젝트 정보 조회 +export async function GET( + request: NextRequest, + { params }: { params: { projectId: string } } +) { + try { + const session = await getServerSession(authOptions); + if (!session?.user) { + return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); + } + + const projectService = new ProjectService(); + + // 프로젝트 접근 권한 확인 + const access = await projectService.checkProjectAccess( + params.projectId, + Number(session.user.id) + ); + + if (!access.hasAccess) { + return NextResponse.json( + { error: '프로젝트에 접근할 수 없습니다' }, + { status: 403 } + ); + } + + // 프로젝트 정보 가져오기 + const project = await projectService.getProject(params.projectId); + + if (!project) { + return NextResponse.json( + { error: '프로젝트를 찾을 수 없습니다' }, + { status: 404 } + ); + } + + // 사용자의 역할과 함께 프로젝트 정보 반환 + return NextResponse.json({ + ...project, + role: access.role, + isOwner: access.isOwner, + }); + } catch (error) { + console.error('프로젝트 조회 오류:', error); + return NextResponse.json( + { error: '프로젝트 정보를 불러올 수 없습니다' }, + { status: 500 } + ); + } +} + +// PATCH: 프로젝트 정보 수정 +export async function PATCH( + request: NextRequest, + { params }: { params: { projectId: string } } +) { + try { + const session = await getServerSession(authOptions); + if (!session?.user) { + return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); + } + + const body = await request.json(); + const projectService = new ProjectService(); + + // Admin 이상 권한 확인 + const access = await projectService.checkProjectAccess( + params.projectId, + Number(session.user.id), + 'admin' + ); + + if (!access.hasAccess) { + return NextResponse.json( + { error: '프로젝트를 수정할 권한이 없습니다' }, + { status: 403 } + ); + } + + await projectService.updateProjectSettings( + params.projectId, + Number(session.user.id), + body + ); + + return NextResponse.json({ success: true }); + } catch (error) { + console.error('프로젝트 수정 오류:', error); + return NextResponse.json( + { error: '프로젝트 수정에 실패했습니다' }, + { status: 500 } + ); + } +} + +// DELETE: 프로젝트 삭제 +export async function DELETE( + request: NextRequest, + { params }: { params: { projectId: string } } +) { + try { + const session = await getServerSession(authOptions); + if (!session?.user) { + return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); + } + + const projectService = new ProjectService(); + + // Owner만 삭제 가능 + await projectService.deleteProject(params.projectId, session.user.id); + + return NextResponse.json({ success: true }); + } catch (error: any) { + if (error.message.includes('소유자')) { + return NextResponse.json( + { error: error.message }, + { status: 403 } + ); + } + + console.error('프로젝트 삭제 오류:', error); + return NextResponse.json( + { error: '프로젝트 삭제에 실패했습니다' }, + { status: 500 } + ); + } +}
\ No newline at end of file |
